package com.yw.android.common.utils;

import android.content.Intent;
import android.os.Bundle;

import org.json.JSONArray;
import org.json.JSONObject;

public class KVUtils {
    /**
     * 日志标签
     */
    private final static String TAG = "KVUtils";

    /**
     * 获取Bundle对象中的指定关键字对应的值
     *
     * @param bundle       Bundle对象
     * @param key          指定关键字
     * @param defaultValue 默认值
     * @return 指定关键字对应的值
     */
    public static String get(Bundle bundle, String key, String defaultValue) {
        if ((null != bundle) && (!TextUtils.empty(key)) && bundle.containsKey(key)) {
            return bundle.getString(key);
        }

        return defaultValue;
    }

    /**
     * 获取Bundle对象中的指定关键字对应的值
     *
     * @param i            Intent对象
     * @param key          指定关键字
     * @param defaultValue 默认值
     * @return 指定关键字对应的值
     */
    public static String get(Intent i, String key, String defaultValue) {
        if ((null != i) && (!TextUtils.empty(key))) {
            return i.getStringExtra(key);
        }

        return defaultValue;
    }

    /**
     * 添加一对有效键值到Intent对象中
     *
     * @param i     Intent对象
     * @param key   键值KEY
     * @param value 键值
     */
    public static Intent put(Intent i, String key, String value) {
        if (null != i && (!TextUtils.empty(key)) && (!TextUtils.empty(value))) {
            i.putExtra(key, value);
        }

        return i;
    }

    /**
     * 将Intent对象中指定值添加到Bundle对象中
     *
     * @param to   目标Bundle对象
     * @param from 源Intent对象
     * @param key  指定关键字
     * @return 目标Bundle对象
     */
    public static Bundle put(Bundle to, Intent from, String key) {
        if ((null != to) && (null != from) && (!TextUtils.empty(key)) && from.hasExtra(key)) {
            Bundle b = from.getExtras();
            Object value = b.get(key);

            if (value instanceof Boolean) {
                to.putBoolean(key, (Boolean) value);
            } else if (value instanceof Byte) {
                to.putByte(key, (Byte) value);
            } else if (value instanceof Character) {
                to.putChar(key, (Character) value);
            } else if (value instanceof Short) {
                to.putShort(key, (Short) value);
            } else if (value instanceof Integer) {
                to.putInt(key, (Integer) value);
            } else if (value instanceof Long) {
                to.putLong(key, (Long) value);
            } else if (value instanceof Float) {
                to.putFloat(key, (Float) value);
            } else if (value instanceof Double) {
                to.putDouble(key, (Double) value);
            } else if (value instanceof String) {
                to.putString(key, (String) value);
            }
        }

        return to;
    }

    /**
     * 安全获取JSON对象中的子对象
     *
     * @param jo   JSON对象
     * @param name 名字
     * @return 指定名字对应的子对象
     */
    public static JSONObject getObject(JSONObject jo, String name) {
        try {
            if ((null != jo) && (jo.has(name))) {
                return jo.getJSONObject(name);
            }
        } catch (Exception e) {
            LOG.w("[" + name + "] get object failed: " + e);
        }

        return null;
    }

    /**
     * 安全获取JSON对象中的Boolean类型
     *
     * @param jo           JSON对象
     * @param name         名字
     * @param defaultValue 默认值
     * @return 指定名字对应的Boolean类型
     */
    public static boolean getBoolean(JSONObject jo, String name, boolean defaultValue) {
        try {
            if ((null != jo) && (jo.has(name))) {
                return TextUtils.equals(jo.getString(name), "1");
            }
        } catch (Exception e) {
            LOG.w("[" + name + "][" + defaultValue
                    + "] get boolean failed: " + e);
        }

        return defaultValue;
    }

    /**
     * 安全获取JSON对象中的整型
     *
     * @param jo           JSON对象
     * @param name         名字
     * @param defaultValue 默认值
     * @return 指定名字对应的整型
     */
    public static int getInt(JSONObject jo, String name, int defaultValue) {
        try {
            if ((null != jo) && (jo.has(name))) {
                return Integer.parseInt(jo.getString(name));
            }
        } catch (Exception e) {
            LOG.w("[" + name + "][" + defaultValue
                    + "] get int failed: " + e);
        }

        return defaultValue;
    }

    /**
     * 安全获取JSON对象中的长整型
     *
     * @param jo           JSON对象
     * @param name         名字
     * @param defaultValue 默认值
     * @return 指定名字对应的长整型
     */
    public static long getLong(JSONObject jo, String name, long defaultValue) {
        try {
            if ((null != jo) && (jo.has(name))) {
                return Long.parseLong(jo.getString(name));
            }
        } catch (Exception e) {
            LOG.w("[" + name + "][" + defaultValue
                    + "] get long failed: " + e);
        }

        return defaultValue;
    }

    /**
     * 安全获取JSON对象中的字符串类型
     *
     * @param jo           JSON对象
     * @param name         名字
     * @param defaultValue 默认值
     * @return 指定名字对应的字符串类型
     */
    public static String getString(JSONObject jo, String name, String defaultValue) {
        try {
            if ((null != jo) && (jo.has(name))) {
                return jo.getString(name);
            }
        } catch (Exception e) {
            LOG.w("[" + name + "][" + defaultValue
                    + "] get string failed: " + e);
        }

        return defaultValue;
    }

    /**
     * 安全获取JSON对象中的字符串数组类型
     *
     * @param jo   JSON对象
     * @param name 名字
     * @return 指定名字对应的字符串数组类型
     */
    public static String[] getStringArry(JSONObject jo, String name) {
        try {
            if ((null != jo) && (jo.has(name))) {
                JSONArray ja = jo.getJSONArray(name);
                String[] ss = new String[ja.length()];

                for (int i = 0; i < ja.length(); i++) {
                    ss[i] = ja.getString(i);
                }

                return ss;
            }
        } catch (Exception e) {
            LOG.w("[" + name + "] get string array failed: " + e);
        }

        return new String[]{};
    }

    /**
     * 将Boolean型值写入JSON对象
     *
     * @param jo    JSON对象
     * @param name  名字
     * @param value 对应的Boolean型值
     */
    public static void putBoolean(JSONObject jo, String name, boolean value) {
        try {
            if (null != jo) {
                jo.put(name, (value ? "1" : "0"));
            }
        } catch (Exception e) {
            LOG.w("[" + name + "][" + value
                    + "] put boolean failed: " + e);
        }
    }

    /**
     * 将整型值写入JSON对象
     *
     * @param jo    JSON对象
     * @param name  名字
     * @param value 对应的整型值
     */
    public static void putInt(JSONObject jo, String name, int value) {
        try {
            if (null != jo) {
                jo.put(name, ("" + value));
            }
        } catch (Exception e) {
            LOG.w("[" + name + "][" + value
                    + "] put int failed: " + e);
        }
    }

    /**
     * 将长整型值写入JSON对象
     *
     * @param jo    JSON对象
     * @param name  名字
     * @param value 对应的长整型值
     */
    public static void putLong(JSONObject jo, String name, long value) {
        try {
            if (null != jo) {
                jo.put(name, ("" + value));
            }
        } catch (Exception e) {
            LOG.w("[" + name + "][" + value
                    + "] put long failed: " + e);
        }
    }

    /**
     * 将字符串写入JSON对象
     *
     * @param jo    JSON对象
     * @param name  名字
     * @param value 对应的字符串
     */
    public static void putString(JSONObject jo, String name, String value) {
        try {
            if ((null != jo) && (null != value) && (value.length() > 0)) {
                jo.put(name, value);
            }
        } catch (Exception e) {
            LOG.w("[" + name + "][" + value
                    + "] put string failed: " + e);
        }
    }

    /**
     * 将字符串数组写入JSON对象
     *
     * @param jo     JSON对象
     * @param name   名字
     * @param values 对应的字符串数组
     */
    public static void putStringArray(JSONObject jo, String name, String[] values) {
        try {
            if ((null != jo) && (null != values) && (values.length > 0)) {
                JSONArray ja = new JSONArray();
                for (String value : values) {
                    ja.put(value);
                }
                jo.put(name, ja);
            }
        } catch (Exception e) {
            LOG.w("[" + name + "] put string array failed: " + e);
        }
    }
}
